(function ($, pilote, undefined){

    /************************/
    /* VARIABLES DE L'OBJET */
    /************************/
    
    // Variable 'alias' permettant de ne pas tout le temps à avoir a réécrire le prototype
    var proto = pilote.util.createClass('Inventory.object').prototype;
    
    // Variable permettant d'effectuer des appels de services
    proto.service = null;
    
    // Variable de gestion du template
    proto.template = null;
    
    // Variable de gestion des cartes
    proto.cards = null;
    proto.maxSelect = null;
    proto.selectedCard = [];
    proto.cardByLine = 5;    
    
    // Variable de définissant les boutons
    proto.listBtn = {'disabled' : '/cartine/images/grey_arrow.png'
    				,'enable' : '/cartine/images/green_arrow.png'
    				}
    
    /***************************/
    /* CONSTRUCTEUR DE L'OBJET */
    /***************************/
    /**
     * Constructeur de l'objet
     * @param {Function} service : service permettant d'effectuer des appels de services
     */
    proto.initialize = function (service) {
        var self = this;
        // Mise en place des éléments
        self.service = service;
        // Gestion du template
        self.template = $('#book');
        // Récupération des cartes du joueur
        self.setData();
        self.show();
        // Gestion des actions
        self.bindEvenements(self);
    };
    /*********************************/
    /* METHODES/FONCTIONS DE L'OBJET */
    /*********************************/
    /**
     * Méthode de liaison des éléments de la page aux actions
     */
    proto.bindEvenements = function (){
    	var self = this;
    	self.template.find('.btn-action').die('click').live('click', {instance : self}, self.handler.readyToPlay);
    	self.template.find('.listCard img').die('click').bind('click', {instance : self}, self.handler.selectCard);
    	self.template.find('.hand img').die('click').live('click', {instance : self}, self.handler.unselectCard);
    }
    
    /**
     * Méthode de mise en place des éléments de l'objet
     */
    proto.setData = function(){
        var self = this;
        // Appel au serveur pour la gestion des cartes
        function handler(response){
			self.cards = createCardList(response.deck);
			self.maxSelect = response.number ;
		}
		mgr.service('card/',					// Opération à effectuer
					{ },						// Paramètres passés
					handler,					// Fonction à effectuer au retour de la demande
					{ dataType: 'JSON', loader: 'Chargement en cours ...', async: false}			// Options
					);
    }
    
    /**
     * Méthode d'affichage de l'objet
     */
    proto.show = function(){
    	var self = this,
    		comp = 0,
    		inventory = '<div class="line">';
    	
		// Parcours des cartes du plateau pour construction de l'affichage
		for ( var indx = 0; indx < self.cards.length; indx++ ){
			if (comp >= self.cardByLine){
				inventory += '</div><div class="line">';
				comp = 0;
			}
			inventory += '<div class="cell">%s</div>'.format(self.cards[indx].toString());
			comp += 1;
		}
    	self.template.find('.listCard').html(inventory+ '</div>');
    }
    
    /**
     * Méthode d'affichage de la main du joueur
     */
    proto.showHand = function(){
    	var self = this,
			btn = self.template.find('.btn-action');
    	// Gestion du bouton
		if (self.selectedCard.length == self.maxSelect){
			btn.removeAttr('disabled');
			btn.html('<img src="%s">'.format(self.listBtn['enable']));
		}else{
			// Gestion du bouton
			btn.attr('disabled', 'disabled');
			btn.html('<img src="%s">'.format(self.listBtn['disabled']));
		}
    	// Gestion de la main
		var selection = '';
		$.each(self.selectedCard, function(idx, value) {
			selection += '<li>%s</li>'.format(value.toString());
			});
		self.template.find('.selection').html(selection);
    }
    
	/************************/
	/* HANDLERS DES ACTIONS */
	/************************/
	
	proto.handler = {};
	
	proto.handler.readyToPlay = function (evt) {
		var self = evt.data.instance,
			btn = self.template.find('.btn-action'),
			listCard = [];
		
		if (btn.attr('disabled') != 'disabled'){
			// Formatage de la réponse
			for ( var indx = 0; indx < self.selectedCard.length; indx++ ){
				listCard.push(self.selectedCard[indx].name);
	    	}
			// Appel au serveur pour le demarrage de la partie
			function handler(response){
				if (response.error == 0){
					pilote.dialog.info(response.msg,
					  		   'Information'
							   );
				}else{
					window.location = '/cartine/loadGame/';
				}
			}
			self.service('init/',										// Opération à effectuer
						{ 'cards' :  JSON.stringify(listCard) },						// Paramètres passés
						handler,										// Fonction à effectuer au retour de la demande
						{ dataType: 'HTML', loader: 'Chargement en cours ...', async: false}			// Options
						);			
		}
	}

	proto.handler.selectCard = function (evt) {
		var self = evt.data.instance,
			card = self.cards[$(this).attr('name')];
		
		// Gestion de la selection de la carte
		if ($(this).parent().attr('selected') != 'selected'){
			// Gestion du nombre de cartes selectionnées
			if (self.selectedCard.length < self.maxSelect){
				// Ajout d'un élément au tableau des éléments sélectionné
				self.selectedCard.push(card);
				// Affichage de la carte dans la partie gauche du livre
				self.template.find('.representation').html(card.toString());
				// Gestion du style
				$(this).parent().attr('selected', 'selected');
				// Affichage de la main
				self.showHand();
			}
		}
	}
	
	proto.handler.unselectCard = function (evt) {
		var self = evt.data.instance,
			li = $(this).parent(),
			liRightCard = self.template.find('.listCard img[name="%s"]'.format($(this).attr('name'))).parent();
			// Reset des css
			liRightCard.removeAttr('selected');
			// Suppression dans le tableau
			var that = this
			$.each(self.selectedCard, function(idx, value) {
				console.debug(value);
				if (value.id == $(that).attr('name')){
					self.selectedCard.splice(idx,1);
					return false;
				}
			});
			// Affichage de la main
			self.showHand();
	}
	
	
    
})(window.jQuery, window.pilote);
